from flask import Blueprint, jsonify, request  # 导入Flask相关模块
import hashlib, time, requests  # 导入随机数模块

from applications.models import Admin
from applications.models.frontend import *  # 导入后台管理员模型
import jwt
from datetime import datetime, timedelta
from flask import current_app

# 创建认证管理蓝图
auth_bp = Blueprint('auth_bp', __name__, url_prefix='/system/auth')

# 存储验证码（在实际应用中，建议使用数据库或缓存）
verification_codes = {}

# 发送验证码
@auth_bp.route('/send-code', methods=['POST'])
def send_code():
    data = request.json  # 获取请求中的JSON数据
    mobile = data.get('phone')  # 获取手机号
    # 手机号未注册
    user = Admin.query.filter_by(phone=mobile).first()
    if user is None:
        return jsonify({'code': 400, 'msg': '手机号未注册！请注册'})

    print(mobile)
    if not mobile:
        return jsonify({'code': 400, 'msg': '手机号不能为空！'}) # 返回错误信息
    url = 'https://api.netease.im/sms/sendcode.action'
    """
    AppKey	网易云信分配的账号，请替换你在管理后台应用下申请的Appkey
    Nonce	随机数（最大长度128个字符）
    CurTime	当前UTC时间戳，从1970年1月1日0点0 分0 秒开始到现在的秒数(String)
    CheckSum	SHA1(AppSecret + Nonce + CurTime)，三个参数拼接的字符串，进行SHA1哈希计算，转化成16进制字符(String，小写)
    """
    AppKey = "ddb78afaf78e858a98d135946d1d30c3"
    # 生成128个长度以内的随机字符串
    nonce = hashlib.new('sha512', str(time.time()).encode("utf-8")).hexdigest()
    # 获取当前时间戳
    curtime = str(int(time.time()))
    # 网易云信的 App Secret
    AppSecret = "c7fc908d79a1"
    # 根据要求进行SHA1哈希计算
    check_sum = hashlib.sha1((AppSecret + nonce + curtime).encode("utf-8")).hexdigest()

    header = {
        "AppKey": AppKey,
        "Nonce": nonce,
        "CurTime": curtime,
        "CheckSum": check_sum
    }
    data = {
        'mobile': mobile,  # 手机号
        "templateid": 27166622,
    }
    try:
        resp = requests.post(url, data=data, headers=header)
        resp.raise_for_status()  # 检查请求是否成功
        print("Response:", resp.content)

        # 生成并存储验证码,并将字节串解码为字符串
        response_data = resp.json()  # 解析 JSON 数据
        verification_code = response_data.get("obj")  # 提取验证码部分
        verification_codes[mobile] = verification_code  # 存储验证码
        print(f"验证码已发送到 {mobile}: {verification_code}")  # 仅用于调试，实际应用中不应打印验证码

        return jsonify({'code': 200, 'msg': '验证码发送成功！'}), 200
    except requests.exceptions.RequestException as e:
        print("请求失败:", e)
        return jsonify({'code': 500, 'msg': str(e), 'error': str(e)})

# 手机登录验证验证码
@auth_bp.route('/verify-code', methods=['POST'])
def verify_code():
    data = request.json  # 获取请求中的JSON数据
    mobile = data.get('phone')  # 获取手机号
    code = data.get('code').strip()  # 获取用户输入的验证码,并去除空格

    print('flask储存', verification_codes)
    print('用户输入', data)
    if not mobile or not code:
        return jsonify({'code': 400, 'msg': '手机号和验证码不能为空！'})  # 返回错误信息

    # 验证验证码
    if mobile in verification_codes and verification_codes[mobile] == str(code):
        del verification_codes[mobile]  # 验证成功后删除验证码
        # 查找用户
        user = Admin.query.filter_by(phone=mobile).first()
        if user:
            token = generate_jwt(user.id)  # 生成新的 JWT
            return jsonify({'code': 200, 'msg': '登录成功！', 'token': token}), 200
        return jsonify({'code': 400, 'msg': '用户未找到！'})
    else:
        return jsonify({'code': 400, 'msg': '验证码错误或已过期！'}) # 返回错误信息

# 生成JWT
def generate_jwt(user_id):
    payload = {
        'user_id': user_id,
        'exp': datetime.utcnow() + current_app.config['JWT_EXPIRATION_DELTA'],
        'iat': datetime.utcnow()
    }
    return jwt.encode(payload, current_app.config['JWT_SECRET_KEY'], algorithm='HS256')
    # 后续扩展----无感刷新token
    # now = datetime.datetime.utcnow()
    # if token_type == 'access':
    #     payload = {
    #         'uid': uid,
    #         'role': role,
    #         'perms': perms,
    #         'type': 'access',
    #         'exp': now + datetime.timedelta(minutes=30),
    #         'iat': now
    #     }
    # else:  # refresh
    #     payload = {
    #         'uid': uid,
    #         'type': 'refresh',
    #         'exp': now + datetime.timedelta(days=7),
    #         'iat': now
    #     }
    # return jwt.encode(payload, current_app.config['JWT_SECRET_KEY'], algorithm='HS256')

# 解码JWT
def decode_jwt(token):
    try:
        payload = jwt.decode(token, current_app.config['JWT_SECRET_KEY'], algorithms=['HS256'])
        return payload['user_id']
    except jwt.ExpiredSignatureError:
        return None  # Token 已过期
    except jwt.InvalidTokenError:
        return None  # Token 无效

# 注册认证管理蓝图
def register_auth_bps(app):
    app.register_blueprint(auth_bp)

